package zw_801_900.zw_892_三维形体的表面积;

class Solution {

    public static void main(String[] args) {
        int[][] grid = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
        int area = surfaceArea(grid);
        System.out.println(area);
    }

    public static int surfaceArea(int[][] grid) {
        int n = grid.length, area = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                // 先把grid[i][j]赋值给level，省掉了bound check，可以略微略微略微优化一下耗时。。。
                int level = grid[i][j];
                if (level > 0) {
                    // 一个柱体中：2个底面 + 所有的正方体都贡献了4个侧表面积
                    area += 4 * level + 2;
                    // 减掉 i 与 i-1 相贴的两份表面积
                    area -= i > 0 ? 2 * Math.min(level, grid[i - 1][j]) : 0;
                    // 减掉 j 与 j-1 相贴的两份表面积
                    area -= j > 0 ? 2 * Math.min(level, grid[i][j - 1]) : 0;
                }
            }
        }
        return area;
    }
}
